/**
* Copyright OPS4J
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License. You may obtain
* a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author nmw
* @version $Id: $Id
*/
package org.ops4j.pax.wicket.spi.support;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import javax.inject.Inject;
import org.apache.wicket.Component;
import org.apache.wicket.MarkupContainer;
import org.apache.wicket.Page;
import org.apache.wicket.Session;
import org.apache.wicket.authroles.authentication.AuthenticatedWebSession;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.protocol.http.WebSession;
import org.ops4j.pax.wicket.api.PaxWicketInjector;
public abstract class AbstractPaxWicketInjector implements PaxWicketInjector {
/**
* <p>getSingleLevelOfFields.</p>
*
* @param clazz a {@link java.lang.Class} object.
* @return a {@link java.util.List} object.
*/
protected List<Field> getSingleLevelOfFields(Class<?> clazz) {
List<Field> fields = new ArrayList<Field>();
for (Field field : clazz.getDeclaredFields()) {
if (!field.isAnnotationPresent(Inject.class)) {
continue;
}
fields.add(field);
}
return fields;
}
/**
* <p>getFields.</p>
*
* @param clazz a {@link java.lang.Class} object.
* @return a {@link java.util.List} object.
*/
protected List<Field> getFields(Class<?> clazz) {
List<Field> fields = new ArrayList<Field>();
while (clazz != null && !isBoundaryClass(clazz)) {
for (Field field : clazz.getDeclaredFields()) {
if (!field.isAnnotationPresent(Inject.class)) {
continue;
}
fields.add(field);
}
clazz = clazz.getSuperclass();
}
return fields;
}
/**
* <p>isBoundaryClass.</p>
*
* @param clazz a {@link java.lang.Class} object.
* @return a boolean.
*/
protected boolean isBoundaryClass(Class<?> clazz) {
if (clazz.equals(WebPage.class) || clazz.equals(Page.class) || clazz.equals(Panel.class)
|| clazz.equals(MarkupContainer.class) || clazz.equals(Component.class)
|| clazz.equals(AuthenticatedWebSession.class) || clazz.equals(WebSession.class)
|| clazz.equals(Session.class) || clazz.equals(Object.class)) {
return true;
}
return false;
}
/**
* <p>setField.</p>
*
* @param component a {@link java.lang.Object} object.
* @param field a {@link java.lang.reflect.Field} object.
* @param proxy a {@link java.lang.Object} object.
*/
protected void setField(Object component, Field field, Object proxy) {
try {
checkAccessabilityOfField(field);
field.set(component, proxy);
} catch (Exception e) {
throw new RuntimeException("Bumm", e);
}
}
private void checkAccessabilityOfField(Field field) {
if (!field.isAccessible()) {
field.setAccessible(true);
}
}
/**
* <p>getBeanType.</p>
*
* @param field a {@link java.lang.reflect.Field} object.
* @return a {@link java.lang.Class} object.
*/
protected Class<?> getBeanType(Field field) {
Class<?> beanType = field.getType();
return beanType;
}
/**
* <p>countComponentContainPaxWicketBeanAnnotatedFieldsHierachical.</p>
*
* @param component a {@link java.lang.Class} object.
* @return a {@link java.util.Set} object.
*/
protected Set<String> countComponentContainPaxWicketBeanAnnotatedFieldsHierachical(Class<?> component) {
Set<String> foundAnnotation = new HashSet<String>();
Class<?> clazz = component;
while (clazz != null && !isBoundaryClass(clazz)) {
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(Inject.class)) {
foundAnnotation.add(field.toGenericString());
}
}
clazz = clazz.getSuperclass();
}
return foundAnnotation;
}
/**
* <p>countComponentContainPaxWicketBeanAnnotatedOneLevel.</p>
*
* @param component a {@link java.lang.Class} object.
* @return a {@link java.util.Set} object.
*/
protected Set<String> countComponentContainPaxWicketBeanAnnotatedOneLevel(Class<?> component) {
Set<String> foundAnnotation = new HashSet<String>();
Class<?> clazz = component;
for (Field field : clazz.getDeclaredFields()) {
if (field.isAnnotationPresent(Inject.class)) {
foundAnnotation.add(field.toGenericString());
}
}
return foundAnnotation;
}
}